一、题目要求
- 可以实现用户的登录、注销
- 注销之后,用户就不能再进入主页面了
二、思路分析
- 首先我们需要编写3个jsp页面,分别是登录页面、登录成功页面、登录失败页面
- 理清楚这些页面之间的跳转关系
三、代码实现
一、jsp页面
<%--登录页面--%>
<body>
<h1>登录</h1>
<form action="/servlet/login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
<%--登录失败页面--%>
<body>
<h1>失败</h1>
<h3>没有权限或用户名错误</h3>
<a href="/login.jsp">返回登录页</a>
</body>
<%--登录成功页面--%>
<body>
<h1>登录成功</h1>
<p><a href="/servlet/logout">注销</a></p>
</body>
最后在项目中路径下呈现为:
二、Servlet编写
/*
* 实现登录功能的Servlet
* */
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("/fail.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
/*
* 实现注销功能的Servlet
* */
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session的属性
Object userSession = req.getSession().getAttribute(Constant.USER_SESSION);
if (userSession != null){
//移除Session中的属性值,实现注销功能
req.getSession().removeAttribute(Constant.USER_SESSION);
//注销之后重定向到登录页面
resp.sendRedirect("/Login.jsp");
}else {
resp.sendRedirect("/Login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
三、存放Session属性
/*
* 用于存放Session属性,降低代码耦合度
* */
public class Constant {
public final static String USER_SESSION="USER_SESSION";
}
四、Filter过滤器编写
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//强转请求和响应的类型,这样后面才能使用Session
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//判断Session属性是否为空
if (request.getSession().getAttribute(Constant.USER_SESSION) == null){
//为空,则重定向到登录页面,就此实现注销之后不能再进入登录成功页面
response.sendRedirect("/Login.jsp");
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() { }
}
五、web.xml配置文件
<!--注册实现登录功能的Servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.wae.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
<!--注册实现注销功能的Servlet-->
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.wae.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>
<!--注册过滤器-->
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.wae.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<!--/sys路径下的请求和响应都要经过该过滤器-->
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
六、测试
把项目部署到Tomcat服务器上,启动Tomcat服务器,在浏览器的地址栏输入:http://localhost:8080/Login.jsp
先输入123,回车。
跳转到登录失败页面,再点击返回登录页。输入admin,回车。
显示登录成功。
我们再把登录成功页面的地址复制下来,点击注销。回到登陆页面,再把刚才复制下来的地址粘贴到地址栏,回车。
发现无法进入登录成功页面,页面还是停留在登录页面。
以上就是一个过滤器的小练习,实现权限拦截的这样一个功能。
我们再把登录成功页面的地址复制下来,点击注销。回到登陆页面,再把刚才复制下来的地址粘贴到地址栏,回车。
发现无法进入登录成功页面,页面还是停留在登录页面。
以上就是一个过滤器的小练习,实现权限拦截的这样一个功能。