拦截器在做项目中应用十分广泛,掌握好拦截器会让你事半功倍。接下来展示下我的在登录中用到的拦截器。
具体操作是:正常情况下:当进入登录页面,输入正确的用户名与密码后跳转到登录成功界面。在session中设置自动销毁时间并登录成功后,可以在相应的时间内免除登录。
不正常情况下:有的用户直接访问登录成功的界面,很显然,这是不可以的。所以访问登录成功页面后就会进入拦截器,如果拦截到你没有登录,会跳转到登录界面。
登录界面
<form action="userServlet">
用户名:<input type="text" name = "name"/>
密码:<input type="password" name = "password"/>
<input type="submit"/>
</form>
登录成功后的界面是logok.jsp
在web.xml界面配置拦截器
<filter>
<filter-name>UserFilter</filter-name>
<filter-class>com.zr.filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserFilter</filter-name>
<url-pattern>/logok.jsp</url-pattern>
</filter-mapping>
为了简单起见,dao中与service中的接口我就不写了,直接写实现类
工具类
public class DBUtil {
private static Connection conn =null;
public static Connection getConnection(){
//有些操作在执行完之后关闭了连接对象,那么虽然对象不为空,但是被关闭的连接对象不可用了
try {
//如果connection对象为null或者当前这个资源已经被关闭,那么就重新创建一个连接
if(conn==null||conn.isClosed()){
try {
//1-加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2-创建连接
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
, "SCOTT", "TIGER");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
public static void close(Connection conn,Statement statement,ResultSet rSet){
try {
if(conn!=null){
conn.close();
}
if(statement!=null){
statement.close();
}
if(rSet!=null){
rSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 封装的是对表数据操作的所有方法
* Object...args可变参数,代表可以有1个或者多个以上的参数
* @return
*/
public static boolean update(String sql,Object...args){
Connection connection = getConnection();
PreparedStatement pStatement = null;
int rowcount = 0;
try {
pStatement = connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
//预编译sql语句中每一个?占位符赋值
pStatement.setObject(i+1, args[i]);
}
//insert into emp values();
rowcount = pStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(connection, pStatement, null);
}
return rowcount==0?false:true;
}
}
dao层实现类
@Override
public User findByName(String uname) {
User user=null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<User> list = new ArrayList<User>();
try {
conn = DBUtil.getConnection();
String sql = "select * from user_table where name = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, uname);
rs = ps.executeQuery();
while(rs.next()){
String name = rs.getString(1);
String password = rs.getString(2);
user = new User(name, password);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
service层实现类
public class UserServiceImpl implements UserService{
@Override
public User findByName(String uname) {
UserDao dao = new UserDaoImpl();
return dao.findByName(uname);
}
}
servlet类
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
UserService service = new UserServiceImpl();
User user = service.findByName(name);
HttpSession session = request.getSession();
if(user == null){
//用户名不存在
response.sendRedirect("login.jsp");
}else{
if(!password.equals(user.getPassword())){
response.sendRedirect("login.jsp");
}else{
session.setAttribute("name", user.getName());
session.setMaxInactiveInterval(2);
response.sendRedirect("logok.jsp");
}
}
拦截器类
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter.......");
HttpServletRequest req = (HttpServletRequest)request;
String name = (String) req.getSession().getAttribute("name");
System.out.println(name);
if(name!=null){
request.getRequestDispatcher("logok.jsp").forward(request, response);
}else{
request.getRequestDispatcher("login.jsp").forward(request, response);
}
chain.doFilter(request, response);
}
实体类
public class User {
private String name;
private String password;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}
}
完整的项目代码已经上传到github中了,其中包括上面说到的要导入的包,访问地址:github
1.JPG