1.使用cookie session 实现自动登陆
1)登陆成功时,创建cookie 设置cookie保存时长 用于返回到前端
2)登陆成功时,向request中添加session 用于filter
LoginServlet.java:
@WebServlet("/login")
/* ... doGet
... 设置编码*/
String number = request.getParameter("number");
String password = request.getParameter("password");
String inputCode = request.getParameter("inputCode");
String randomCode = (String)request.getSession().getAttribute("changeCode");
// 调用service层 返回查询结果
UserService service = new UserServiceImpl();
List<User> user = service.loginByNumber(number,password);
// 如果查询结果不为空 与 验证码输入正确
if (user.toString() != "" && inputCode.equals(randomCode)) {
// 创建cookie
Cookie cookie = new Cookie("number",number);
// 设置cookie保存1天
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
// 创建Session
request.getSession().setAttribute("Num",number);
// 登陆成功 转发到主页
request.getRequestDispatcher("index.html").forward(request,response);
}
2.ajax右上角显示已登录账号及退出账号
3)访问主页index.html时,利用ajax调用 findCookieServlet.java 从request中取出cookies 遍历cookies
查找是否有名为number 的cookie 。如果有 将cookie传回前端页面 。
4)点击退出登录 调用ClearCookieServlet.java 清除cookie session 刷新页面
index.html
<!-- 置顶导航栏右侧 -->
<ul class="nav navbar-nav navbar-right">
<li><a id="loginCheck" href="login.html">点此登录</a></li>
<li><a href="personalHomePage.html">个人主页</a></li>
</ul>
...
<script>
$(function () {
$.get("findCookieServlet",{},function (data_cookie) {
var lc = $("#loginCheck");
if (data_cookie) {
lc.html(data_cookie + "欢迎您!");
// 移除“点击登陆”的 href 禁止点击
lc.removeAttr("href");
// 添加退出登录
lc.append("<a href='/ClassWeb/clearCookieServlet'>退出登录</a>");
}
});
});
</script>
FindCookieServlet.java
// 省略了 doGet 编码
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
// 查看是否有名为number的cookie
if ("number".equals(cookie.getName())) {
ObjectMapper mapper = new ObjectMapper();
// 将cookie的值 已登录的学号传到前台
mapper.writeValue(response.getWriter(),cookie.getValue());
}
}
}
成功登陆后:
ClearCookieServlet.java
@WebServlet("/clearCookieServlet")
// doGet中
// 退出登录
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("number".equals(cookie.getName())) {
// 设置时间为0 等同于删除cookie
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
request.getSession().removeAttribute("Num");
response.sendRedirect(request.getContextPath() + "/index.html");
导航栏又回到了 “点此登录”。。
3.使用filter实现未登录拦截
5)进入留言板messageBoard.html页面时 调用 LoginFilter.java
读取session 已有session 放行 ;未有session 既是未登录 跳转到登录页登录
LoginFilter.java
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 强转为HttpServletRequest 否则无法获取资源请求路径
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
Object user = request.getSession().getAttribute("Num");
if (user == null) {
// 未登录 跳转到登录界面
response.getWriter().write("您还未登录,三秒钟后跳转至登录界面...");
response.setHeader("refresh", "3;url=login.html");
} else {
//已登录 放行
chain.doFilter(req, resp);
}
}