登录功能优化
注销功能:
思路:移除session,返回登录页面。
我们在servlet层下面的user包里面创建LogoutServlet:
package com.rgf.servlet.user;
import com.rgf.util.Constants;
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 LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的Constants.USER_SESSION
req.getSession().removeAttribute(Constants.USER_SESSION);
//移除之后要回到登录页面,返回登录界面
resp.sendRedirect("/login.jsp");//我们也可以在前面添加req.getContextPath()+,确保地址不会出错。
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
之后我们在web.xml里面进行注册:
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.rgf.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<!--其中的访问地址我们可以在jsp文件夹里面的common下的head.jsp找到退出系统的地址-->
<url-pattern>/user/logout</url-pattern>
</servlet-mapping>
我们在注册的过程中遇到的退出系统的地址我们在jsp里面的common下的head.jsp进行查找:
<li><a href="${pageContext.request.contextPath }/user/logout">退出系统</a></li>
我们进行运行如下所示:
我们进入登陆界面如下所示:
我们登录成功后如下所示:
之后,我们点击退出,发现出现如下所示:
我们发现应该是重定向出现了错误。我们将代码进行修改如下所示“
resp.sendRedirect(req.getContextPath()+"/login.jsp");
我们进行重启后进行退出如下所示:
登录拦截优化:
我们发现我们登录进去之后,我们将网站:http://localhost:9571/smbms0/jsp/frame.jsp
复制下来之后。退出系统。我们访问该网站的时候,又再一次的进入了系统。
我们应该是退出系统之后,就无法再进入系统了,就无法登录了。但是我们再退出系统之后还是可以进行访问。我们通过过滤器来进行优化。
编写一个过滤器,并进行注册:
我们在filter包里面进行注册SysFilter类:
package com.rgf.filter;
import com.rgf.pojo.User;
import com.rgf.util.Constants;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req; //获取他的session
HttpServletResponse response = (HttpServletResponse) resp; //重定向
//过滤器,从session中获取用户,
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
if(user==null){//该用户已经被移除或者注销了,或者未登录
response.sendRedirect("../error.jsp");
}else{
chain.doFilter(req,resp);
}
}
@Override
public void destroy() {
}
}
之后我们在web.xml里面进行注册如下所示:
<!--用户登录过滤器-->
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.rgf.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<!--如果想访问jsp下面的页面,必须要首先进行登录-->
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
同时我们还需要编写无法登录的界面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html";charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>请登录后再访问该页面</h1>
<a href="login.jsp">返回</a>
</body>
</html>
之后我们进行运行,如下所示:我们成功登录进去之后,退出系统,通过复制网站进去之后,我们发现如下所示:
测试,登录,注销,权限都要保证OK。