当用户访问某网站时,有些页面或 Servlet 在不登录的情况下是可以访问的,例如首页、登录页面等。除此之外大部分资源是必须登录后才能访问的。此时,可以定义一个权限过滤器,对每一个访问该应用的请求进行过滤:若具有访问权限,则直接跳转到相应资源即可;若不具有访问权限,则跳转到登录页面。
修改一下之前写过的登录功能,当用户没有登录时,不能访问login_success页面。
讲下思路:
实现过滤器,获取到hsq和 hsp【这里强转即可】,然后我们取到Session,判断是否登录【Session参数是否为空】,如果为空,则直接返回去,如果是有登录,我们让他看到未登录看不到的JSP:
因为要过滤 所以在WebContent文件夹下创建一个文件夹存放 登录成功才能被查看的JSP,这里是否登录成功用Servlet + 重定向 来写:
首先来个代码结构:
login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 非常简单的一个登录 输入密码bi-hu就往Session里填充 --> <form action="${ pageContext.request.contextPath }/login" method="post" accept-charset="utf-8"> 请输入秘钥登录:<input type="password" name="pass" > <input type="submit" value="登录"> </form> </body> </html>
login.java【这个是登录判断的Servlet】
package Servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 登录Servlet 后台 */ public class login extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String password = request.getParameter("pass"); HttpSession session = request.getSession(); if(password.equals("bi-hu")) { session.setAttribute("isLogin",true ); PrintWriter out = response.getWriter(); out.print( "您已登录成功 请访问 login_success/ok.jsp 查看你的的信息吧! "); }else { //密码错误就重定向 就不提示什么了 简单测试 response.sendRedirect(request.getContextPath() + "/login.jsp"); } } }
cuccess.java 【这是过滤器 过滤全部代码 其中加判断拦截未登录用户【返回登录页面】 记得XML配置】
package filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 过滤器 过滤未登录的请求 //此过滤器已设置过滤全部网址 */ public class cuccess implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //好习惯 先来个编码: request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); //先拿到带Http的Request 和 response 先 【ServletRequest 和 ServletResponse的子类】 HttpServletRequest hsq = (HttpServletRequest)request; HttpServletResponse hsp = (HttpServletResponse)response; //获取请求的路径 【注意这里是请求路径 不是根路径!!】 String path = hsq.getServletPath(); if(path.startsWith("/login_success")) { HttpSession session = hsq.getSession(); if(session == null) { hsp.sendRedirect(hsq.getContextPath() + "/login.jsp"); //重新登录 Session为空 }else { if(session.getAttribute("isLogin") == null || ((boolean)session.getAttribute("isLogin") == false)) { hsp.sendRedirect(hsq.getContextPath() + "/login.jsp"); //重新登录 Session为空 或 为假 } } } chain.doFilter(request, response); } }
login_success 目录下的 ok.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>你已登录! 你看到我了!!!</h1>
</body>
</html>
所以你可以尝试:
http://localhost:8080/filter/login_success/ok.jsp 你未登录 访问他 会无限返回登录页面