7、ssm框架---登陆拦截Interceptor

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nba_linshuhao/article/details/82913445

开发环境:Idea2018.2+maven3.5.4
实现效果
进行增删改查页面只有登陆才能进行操作,登录和注册页面不拦截,被拦截之后自动转到登录页面

一、在springmvc.xml中配置拦截器

<!-- 配置用于session验证的拦截器 -->
    <mvc:interceptors>
        <bean class="com.ssm.interceptor.LoginInterceptor"></bean>
    </mvc:interceptors>

二、自己定义一个拦截器类LoginInterceptor.java

package com.ssm.interceptor;
import com.ssm.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * return false表示拦截,不向下执行
 * return true表示放行,不拦截
 */
public class LoginInterceptor implements HandlerInterceptor {
    //首先会执行的方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
	//   boolean flag = false;
        //获取请求资源
        String requestURI = request.getRequestURI();
        //指定不拦截的路径
        final String[] IGNORE_URI = {"/user/register","/user/login", "/user/registerjump","/user/loginjump" };

        //指定拦截的路径,需要登录才可以进入的页面
        final String[] PRE_UNIGNORE_URI = {
                "/user/toAddUser","/user/addUser","/user/getAllUser",
                "/user/toUpdate","/user/updateUser", "/user/delUser","/user/list"
        };

        //jsp获得当前页面名称 sunString:截取一部分   requestURI.lastIndexOf:表示从uri的最后一个/开始截取
        //比如uri是"C:/abc/edf/123.txt" ,结果就是/123   截取最后一个/和.之间的部分
        String uri = requestURI.substring(requestURI.lastIndexOf("/"));
        //这部分url是特定的,不拦截。   return true表示放行
        if (uri.startsWith("/user/registerjump") || uri.startsWith("/user/loginjump") || uri.startsWith("/user/register")|| uri.startsWith("/user/login")) {
            return true;
        }

        //从session中获取对象
        User user = (User) request.getSession().getAttribute("user");
        //执行循环,依次取出要拦截的字段,如果请求的url中包含该字段,flag=true
        for (String preURI : PRE_UNIGNORE_URI) {
            if (requestURI.contains(preURI)) {
//                flag = true;
                if(user!=null){
                    return true;
                }else{
                    String loginUrl = "/user/loginjump";
                    response.sendRedirect(request.getContextPath() + loginUrl);
                }
            }
        }

//        //有个页面要拦截,判断一下用户是否已经登录: 登录就放行,未登录就拦截
//        if (flag==true) {  //flag为真,表示是拦截的字段,并且session中没有这个用户,就重定向到登录页面

        return true;

    }

    //返回ModelAndView之前执行的方法,面向切面编程中的体现,已经进入了controller
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
//        System.out.println("进入了postHandle。。。。。。");
    }

    //执行Handle完成之后执行的方法
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
//        System.out.println("进入了afterHandle。。。。。。");
    }
}

三、在Controller类的登录控制器方法中,把登录之后的user对象保存在session中,因为在拦截器类中要判断是否登录。主要代码如下:

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private HttpServletRequest request; //自动注入request

    @Autowired
    private IUserService userService;

 /**
     * 登录验证,登录成功跳转到用户信息页面
     * @param name
     * @param password
     * @param model
     * @return
     */
    @RequestMapping("login")
    public String login(@Param("name")String name, @Param("password")String password, Model model) {
        User user=userService.checkByName(name);
        if(name==null||"".equals(name)){  //没有输入姓名
            model.addAttribute("msg1","请输入姓名");
        }else if(user==null||"".trim().equals(user)){ //输入姓名但是姓名错误
            model.addAttribute("msg1","账户不存在,请先注册");
            return "login";
        }else if(user!=null &(password==null||"".equals(password))){ //姓名正确,但没有输入密码
            model.addAttribute("msg2","请输入密码");
        }else if(user!=null &!(user.getPassword().equals(password))) { //姓名正确,输入密码,但是密码错误
            model.addAttribute("msg2","密码错误");

        }else if (user!=null &user.getPassword().equals(password)){ //姓名密码均正确
//            return "redirect:/user/getAllUser";
            HttpSession session = request.getSession();
            session.setAttribute("user",user);
            return "redirect:/user/list";
        }
        return "login";
    }

猜你喜欢

转载自blog.csdn.net/nba_linshuhao/article/details/82913445