以过滤器(filter)为例,实现不同登录情况下的页面跳转
登录登录账户正确,进入主页。
登录账户错误,跳转到错误页面。
用户注销之后,用登录成功的网址再次登录,提示没有登录权限。
-
用户登录之后向Session中放入用户的数据
-
进入主页的时候要判断用户是否已经登陆;要求:在过滤器中实现
补充:还用到了一个提出常量的方法。
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>
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 }
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>
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>
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>
这个注销的注册和映射对应的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 }
注销后,会删除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 }
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>
8、运行
网址为:http://localhost:8080/Login.jsp

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

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

9、总结
上述过程中,过滤器的作用体现在:

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

浙公网安备 33010602011771号