doFilter()方法中定义的是ServletRequest类型的对象,那么要想取得session,则必须进行向下转型,将ServletRequest变为HttpServletRequest接口对象,才能通过getSession()方法取得session对象。
验证 用户名: zhangsan 密码: lisi
过滤器采用注解的方式,只过滤文件夹test里的文件
loginfilter.java
package com.Filter;
import java.io.IOException;
import java.io.PrintWriter;
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.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter (filterName= "loginfilter" ,urlPatterns= "/test/*" )
public class loginfilter implements Filter{
public void init(FilterConfig config) throws ServletException{
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException,ServletException{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
//用来判断是否是从登录页登录。
//若直接判断是否有session,在重新登录时因为此时session还在,如果密码错误也会登录成功。
String userName = request.getParameter("username");
String password = request.getParameter("password");
if(userName!=null && !userName.trim().equals("") && password!=null && !password.trim().equals("") ){ //可以取到表单的信息,说明正在登录页验证登录
if("zhangsan".equals(userName)&&"lisi".equals(password) )
{//验证通过
session.setAttribute("name", userName);
chain.doFilter(request, response); //请求转发给过滤器链上的下一个对象
}
else{ //用户名或密码错误 (或其他去主页的链接 )
response.getWriter().write("wrong username or password. ");
response.getWriter().write("relogin after 2 seconds ");
res.setHeader("refresh", "2;url="+req.getContextPath()+"/login.jsp");
//request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
else if(session.getAttribute("name")!=null){//不是从登录页进去的,但曾经登录过
chain.doFilter(request, response);
}
else {//(曾经)没有登录过
response.getWriter().write("never login,relogin after 3 seconds");
res.setHeader("refresh", "3;url="+req.getContextPath()+"/login.jsp");
//request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public void destroy() {
// TODO Auto-generated method stub
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<head>
<title>登录</title>
</head>
<body>
<form action="test/index.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td > <input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td > <input type="password" name="password"></td>
</tr>
</table>
<input type="submit" name="submit" id="submit" value="登录"/>
</form>
<%
//读取session值
String val= (String)session.getAttribute("name");
//如果session不存在
if(val==null){
val ="不存在";
}
out.print("当前\""+val+"\"用户可自动登录");
%>
<a href="test/index.jsp">主页</a>
<a href="TestPaper.jsp">去测试页</a>
</body>
</html>
TestPaper.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<head>
<title>登录</title>
</head>
<body>
<form action="test/index.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td > <input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td > <input type="password" name="password"></td>
</tr>
</table>
<input type="submit" name="submit" id="submit" value="登录"/>
</form>
<%
//读取session值
String val= (String)session.getAttribute("name");
//如果session不存在
if(val==null){
val ="不存在";
}
out.print("当前\""+val+"\"用户可自动登录");
%>
<a href="test/index.jsp">主页</a>
<a href="TestPaper.jsp">去测试页</a>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>主页</title>
</head>
<body>
<%
String user=(String)session.getAttribute("name");
%>
<%
if(user==null||"".equals(user)){
%>
欢迎!
<a href="http://localhost:8080/Cookie_/login.jsp">登陆界面</a><br>
<%
}else{
%>
欢迎回来 <%=user %>
<a href="logout.jsp">注销</a>
<a href="http://localhost:8080/Cookie_/login.jsp">登陆界面</a><br>
<%
}
%>
</body>
</html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title></title>
</head>
<body>
<%
session.removeAttribute("user");
session.invalidate();
%>
<h1>注销成功</h1>
<a href="login.jsp">relogin</a>
</body>
</html>
运行login.jsp
成功登录后
测试页可直接去主页
另例
未登录无法到主页,跳转到登录页
过滤器Loginfilter.java 限定index.jsp一个页面
package com.imooc.jdbc;
import java.io.IOException;
import java.io.PrintWriter;
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.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter (filterName= "loginfilter" ,urlPatterns= "/index.jsp" )
public class LoginFilter implements Filter {
public void init(FilterConfig config) throws ServletException{
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
HttpSession session = request.getSession();
if(session == null || session.getAttribute("name") == null){
response.sendRedirect("http://localhost:8080/Ser/login.jsp");
}
else {
chain.doFilter(request, response);
}
}
public void destroy() {
// TODO Auto-generated method stub
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
<style>
body{
margin:0px;padding:100px;
text-align:center;
}
</style>
</head>
<body>
<%
String userna=(String)session.getAttribute("name");
%>
<%
if(userna==null||"".equals(userna)){
%>
<table align="center">
<tr align="center">
<td > 欢迎!
<td ><a href="login.jsp">登录</a>
</td>
</tr>
<%
}else{
%>
<table align="center">
<tr align="center">
<td > 欢迎回来 <%=userna %></td>
<td ><a href="logout.jsp">注销</a></td>
<td ><a href="login.jsp">登录页</a></td>
<%
}
%>
<table align="center">
<tr align="center">
<td ><a href="searchServlet?us=<%=userna%>">查询用户信息</a></td>
</tr>
</table>
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<meta charset="UTF-8">
<title>登录</title>
<script type="text/javascript" language = "javascript">
function reloadCode(){
var time = new Date().getTime();
document.getElementById("imag").src="authImg?d="+time;
}
function check(){
//验用户名
var username = document.getElementById("user").value;
var pwd = document.getElementById("pwd").value;
if(username == ""){
alert("用户名不能为空");
return ;
}
if(pwd == ""){
alert("密码不能为空");
return ;
}
document.getElementById("sub").submit();//方法进行到这里将form的action提交
}
</script>
<body>
<form id="sub" action="loginServlet" method="post">
<table align="center">
<tr >
<td>用户名:</td>
<td align="left"> <input type="text" placeholder="输入用户名" name="user" id="user"></td>
</tr>
<tr >
<td>密码:</td>
<td align="left"> <input type="password" placeholder="输入密码" name="pwd" id="pwd"></td>
</tr>
<tr >
<td>验证码:</td>
<td align="left"><input type="text" placeholder="输入验证码" name="text" id="text" size="10"/>
<img src="authImg" id="imag" onclick="reloadCode()"/>
</td>
</tr>
<tr table align="center">
<td ><input type="button" value="提交" onclick="check()"/> </td>
<td ><input type="reset" value="重置"/> </td>
<td ><input type="button" value="注册" onclick="window.location.href='register.jsp'"/></td>
</tr>
</table>
</form>
<center>
<%
//读取session值
String val= (String)session.getAttribute("name");
//如果session不存在
if(val==null){
val ="不存在";
}
out.print("当前\""+val+"\"用户已登录");
%>
<table align="center">
<tr>
<td><input type = "button" value = "主页" onclick="window.location.href='index.jsp'"/></td>
</tr>
</center>
</table>
</form>
</body>
</html>
Loginservlet 调用mysql数据库 具体内容如此
package com.imooc.jdbc;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import com.imooc.jdbc.UserDao;
@WebServlet(name="loginServlet",urlPatterns={"/loginServlet"}) //注解名和post的标签名相同
public class LoginServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
response.setContentType("text/html);charset=UTF-8");
String imageText = request.getParameter("text");
String text = (String) request.getSession().getAttribute("image");
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
UserVO u=new UserVO();
u.setUsername(user);
u.setPassword(pwd);
boolean r=new UserDao().selectByNameAPwd(u);//调用dao层
//页面跳转
if (!text.equalsIgnoreCase(imageText)){
response.getWriter().write("验证码错误,1秒后重新登录");
response.setHeader("refresh", "1;url="+request.getContextPath()+"/login.jsp");
}
else if(r){
//把用户数据保存在session域对象中
request.getSession().setAttribute( "user" , user);
HttpSession session = request.getSession(true);
session.setAttribute("name", user);
out.println("登陆成功,2秒后到主页");
response.setHeader("refresh", "1;url="+request.getContextPath()+"/index.jsp");
}else{
response.getWriter().write("登陆失败,2秒后重新登录");
response.setHeader("refresh", "2;url="+request.getContextPath()+"/login.jsp");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}