今天,做了一个简单的过滤器实现。
就是当你,要登录的时候,用户名正确的话会登录上去,错误的话,会跳到错误页面,如果登陆上去的话,有个注销按钮,如果点了注销按钮,就会返回登录页面,同时,再使用上一次登陆成功的url,是不会成功的。
具体实现:
首先一个,登录界面,一个form表单,一个对应的loginServlet。
loginServlet里面写,比对用户名,如果是这个的话,就要跳转到登录成功页面,错误的话跳转到错误页面。
登陆成功页面,里面有个,显示登陆成功的标志,同时,有个注销的按钮,如果点了注销,就会返回到登录页面,这个注销按钮,创建一个logoutServlet。
然后,再来个错误页面。
错误页面里面有个跳转到登录页面的按钮,返回登录页面。
同时提示错误信息:你的信息出错了。
重头戏来了,怎么在用户注销之后,用户不能通过上次的url直接访问到成功页面呢?
答案就是:过滤器。
创建一个util包,包里有个类,类里定义一个静态常量USER_SESSION。
将这个值存到session里面,用作之后的判断条件。
当登陆的时候,判断用户名是否正确,如果正确,就往USER_SESSION里面赋一个getId的值。
然后进行页面的跳转。
如果出错,就跳转到错误页面。
如果登录成功的话,就会进入到成功页面,成功页面,有一个注销按钮,注销按钮,用来注销用户的session,也就是移除USER_SESSION里的值。
然后,在进行页面的跳转。
再来一个过滤器,用来判断,那个常量类下的USER_SESSION是否为空,如果是空,就跳转到出错页面,如果不为空,继续运行。
这样的话,就可以简单的实现这个过滤器了。
让用户不可以用url来返回已经登录成功的页面。
接下来就是源码 了:
静态常量类:
package com.bai.util;
public class Constant {
public final static String USER_SESSION = "USER_SESSION";
}
登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="/login" method="post">
用户名<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
loginServlet
package com.bai.servlet;
import com.bai.util.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
if (username.equals("admin")){
//存一个session
req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}else{
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
成功页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
<a href="/logout ">注销</a>
</body>
</html>
logoutServlet
package com.bai.servlet;
import com.bai.util.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class logout extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object userSession = req.getSession().getAttribute(Constant.USER_SESSION);
if (userSession !=null){
req.getSession().removeAttribute(Constant.USER_SESSION);
resp.sendRedirect("/login.jsp");
}
if(userSession == null){
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
错误页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>您输入的用户名有问题</h1>
<h1> <a href="/login.jsp">返回主页</a> </h1>
</body>
</html>
过滤器
package com.bai.filter;
import com.bai.util.Constant;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class sysFileter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
if (req.getSession().getAttribute(Constant.USER_SESSION)==null){
resp.sendRedirect("/login.jsp");
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.bai.servlet.loginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.bai.servlet.logout</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>sysFilter</filter-name>
<filter-class>com.bai.filter.sysFileter</filter-class>
</filter>
<filter-mapping>
<filter-name>sysFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
</web-app>
注:本案例学习狂神说,讲的很详细。
视频链接https://www.bilibili.com/video/BV12J411M7Sj?p=27