springmvc 拦截器

MyBlogs-joyiyii / 2023-05-03 / 原文

自定义一个拦截器LoginInterceptor这个拦截器的作用就是用户首次要去访问网站,直接点击首页会被拦截并跳转到登录页面,登录成功后(session有记录)方可直接来到首页不被拦截
测试1:
题目:用户在首次访问前提下,需设置拦截器,使得用户只要登录了才能到达用户主页

思路:首先要优化一下首页index.jsp,在首页放置跳转到登录页面和主页的两个超链接,

用户在首页点击登录后,跳转到controller中路径为/goLogin的方法,这个方法跳转到登录页面login.jsp(因为外部用户不能直接访问到/WEB-INF/目录下的资源,因此只能通过内部跳转),用户在登录页面提交表单到controller中路径为/login的方法,该方法执行完跳转到用户的主页main.jsp。在上面这个过程中需要添加拦截器即不允许用户未经过登录就范文到主页

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>

  <h1><a href="${pageContext.request.contextPath}/goLogin">登录</a> </h1>
  <h1><a href="${pageContext.request.contextPath}/main">主页</a> </h1>

  </body>
</html>
View Code

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<h1>登录页面</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
    <div>
        用户名:<input type="text" name="username" required/>
    </div>
    <div>
        密码<input type="text" name="password" required/>
    </div>
    <input type="submit" value="提交">
</form>
</body>
</html>
View Code

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
这里是用户登录成功后展示的主页!
<%--注销--%>
<p>
    <a href="${pageContext.request.contextPath}/logout">注销用户</a>
</p>
</body>
</html>
View Code

LoginController

@Controller
public class LoginController {
    //处理跳转到main.jsp的前端请求
    @RequestMapping("/main")
    public  String main(){
        return "main";
    }
    //处理首页用户点击登录时候跳转页面操作
    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login";//去到login.jsp
    }

//处理用户提交表单后操作
    @RequestMapping("/login")
    public String login(HttpSession session,String username,String password){
        System.out.println("login==>"+username);
        //把用户信息放在session中
        session.setAttribute("userLoginInfo",username);//键,值
        return "main";
    }

}
View Code
LoginInterceptor
自定义LoginInterceptor这个拦截器的作用就是用户首次要去访问网站,
直接点击首页会被拦截并跳转到登录页面,登录成功后(session有记录)方可直接来到首页不被拦截
//LoginInterceptor这个拦截器的作用就是用户首次要去访问网站,
// 直接点击首页会被拦截并跳转到登录页面,登录成功后(session有记录)方可直接来到首页不被拦截
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session=request.getSession();
        if(request.getRequestURI().contains("goLogin")){
            return true;
        }
        if(request.getRequestURI().contains("login")){
            return true;
        }
        //要先允许用户第一次登录才能记录session,一次用户第一次登录放行
        if(session.getAttribute("userLoginInfo")!=null){
            return  true;
        }
        
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
        return false;
    }
}
View Code

同时注意点:因为拦截器Interceptor是springmvc特有的功能,因此需要注册

  <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lian.config.MyInterceptor"/>

        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lian.config.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
View Code

测试2登录验证:
题目:用户在注销后,需要重新登录账号才能进入用户主页
思路:
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
这里是用户登录成功后展示的主页!
<%--注销--%>
<p>
    <a href="${pageContext.request.contextPath}/logout">注销用户</a>
</p>
</body>
</html>
View Code

在controller层增加处理注销请求的代码

@Controller
public class LoginController {
    //处理跳转到main.jsp的前端请求
    @RequestMapping("/main")
    public  String main(){
        return "main";
    }
    //处理首页用户点击登录时候跳转页面操作
    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login";//去到login.jsp
    }

    @RequestMapping("/login")
    public String login(HttpSession session,String username,String password){
        System.out.println("login==>"+username);
        //把用户信息放在session中
        session.setAttribute("userLoginInfo",username);//键,值
        return "main";
    }
    @RequestMapping("/logout")
    public String  logout(HttpSession session){
        //System.out.println("logout==>"+username);
        session.removeAttribute("userLoginInfo");
        return "main";
    }
}
View Code

总结:理解拦截器的思想,拦截的是哪一个步骤,拦截逻辑以及注册拦截器