以过滤器(filter)为例,实现不同登录情况下的页面跳转

以过滤器(filter)为例,实现不同登录情况下的页面跳转

登录登录账户正确,进入主页。

登录账户错误,跳转到错误页面。

用户注销之后,用登录成功的网址再次登录,提示没有登录权限。

  1. 用户登录之后向Session中放入用户的数据

  2. 进入主页的时候要判断用户是否已经登陆;要求:在过滤器中实现

补充:还用到了一个提出常量的方法。

1、 流程

整体文件框架

1、先写了个Login.jsp页面,这里面有form表单,登录后提交到对应的web.xml中的注册和映射去。

1     <!--注册和映射-->
2     <servlet>
3         <servlet-name>LoginServlet</servlet-name>
4         <servlet-class>com.wang.servlet.LoginServlet</servlet-class>
5     </servlet>
6     <servlet-mapping>
7         <servlet-name>LoginServlet</servlet-name>
8         <url-pattern>/servlet/login</url-pattern>
9     </servlet-mapping>
View Code

2、通过第一步写的web.xml中的注册和映射,找到com.wang.servlet.LoginServlet。

      case1:如果第一步中输入的username为if中的"admin",就跳转到success.jsp

      case2:如果第一步中输入的username不是if中的"admin",就跳转到error.jsp

 1 package com.wang.servlet;
 2 
 3 import com.wang.util.Constant;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import java.io.IOException;
10 
11 public class LoginServlet extends HttpServlet {
12     @Override
13     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14 
15         //获取前端请求的参数
16         String username = req.getParameter("username");
17         if (username.equals("admin")) {//登录成功
18             req.getSession().setAttribute(Constant.USER_SESSION, req.getSession().getId());
19             resp.sendRedirect("/sys/success.jsp");
20         } else {//登录失败
21             System.out.println("登录失败");
22             resp.sendRedirect("/error.jsp");
23         }
24     }
25 
26     @Override
27     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
28         doGet(req, resp);
29     }
30 }
View Code

3、写success.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>Title</title>
 5 </head>
 6 <body>
 7 <h1>主页</h1>
 8 <p><a href="/servlet/logout">注销</a></p>
 9 </body>
10 </html>
View Code

4、写error.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>Title</title>
 5 </head>
 6 <body>
 7 <h1>错误</h1>
 8 <h3>没有权限,用户名错误</h3>
 9 
10 <a href="/Login.jsp">返回登录页面</a>
11 </body>
12 </html>
View Code

5、其中,LogoutServlet类中用到的一个常量,定义在了专门的文件夹util中,写成了Constant类

6、写注销的注册和映射以及servlet

在success.jsp中,如果点了注销,则转到web.xml中注册和映射对应的servlet

1     <!--注册和映射-->
2     <servlet>
3         <servlet-name>LogoutServlet</servlet-name>
4         <servlet-class>com.wang.servlet.LogoutServlet</servlet-class>
5     </servlet>
6     <servlet-mapping>
7         <servlet-name>LogoutServlet</servlet-name>
8         <url-pattern>/servlet/logout</url-pattern>
9     </servlet-mapping>
View Code

这个注销的注册和映射对应的servlet如下:

 1 package com.wang.servlet;
 2 
 3 import com.wang.util.Constant;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import java.io.IOException;
10 
11 public class LogoutServlet extends HttpServlet {
12     @Override
13     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14         Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);
15         if (user_session != null){
16             req.getSession().removeAttribute(Constant.USER_SESSION);
17             resp.sendRedirect("/Login.jsp");
18         }else{
19             resp.sendRedirect("/Login.jsp");
20         }
21     }
22 
23     @Override
24     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
25         doGet(req, resp);
26     }
27 }
View Code

注销后,会删除Session中的username信息,返回到登录页。

6、写过滤器的servlet

 1 package com.wang.filter;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 import java.io.IOException;
 7 
 8 public class SysFilter implements Filter {
 9     @Override
10     public void init(FilterConfig filterConfig) throws ServletException {
11     }
12 
13     @Override
14     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
15         HttpServletRequest request = (HttpServletRequest) req;        //先强转下
16         HttpServletResponse response = (HttpServletResponse) resp;    //先强转下
17         if (request.getSession().getAttribute("USER_SESSION") == null) {
18             response.sendRedirect("/error.jsp");
19         }
20         chain.doFilter(req, resp);  //让程序继续往下走
21     }
22     @Override
23     public void destroy() {
24     }
25 }
View Code

7、写过滤器的注册和映射

1     <!--注册和映射过滤器-->
2     <filter>
3         <filter-name>SysFilter</filter-name>
4         <filter-class>com.wang.filter.SysFilter</filter-class>
5     </filter>
6     <filter-mapping>
7         <filter-name>SysFilter</filter-name>
8         <url-pattern>/sys/*</url-pattern>
9     </filter-mapping>
View Code

8、运行

网址为:http://localhost:8080/Login.jsp

 

 

 case1:当输入正确的用户名时(admin)

 

 

case2:当输入错误的用户名时(如123)

 

9、总结

上述过程中,过滤器的作用体现在:

 

过滤器实现了,事先判断session存储的东西,来决定网页的跳转。

posted @ 2020-04-01 23:56  WZ_BeiHang  阅读(1503)  评论(0)    收藏  举报