实现步骤
- 创建登录页面表单
- 配置欢迎页面
web.xml配置示例
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
DAO层实现
用户接口定义
public interface UserRepository {
User fetchLoginUser(Connection conn, String username) throws SQLException;
}
DAO实现类
public class UserDaoImpl implements UserRepository {
public User fetchLoginUser(Connection conn, String username) throws SQLException {
PreparedStatement stmt = null;
ResultSet result = null;
User account = null;
if (conn != null) {
String query = "SELECT * FROM users WHERE username=?";
Object[] values = {username};
result = DBUtil.executeQuery(conn, stmt, result, query, values);
if (result.next()) {
account = new User();
account.setId(result.getInt("id"));
account.setUsername(result.getString("username"));
account.setPassword(result.getString("password"));
// 其他属性设置
}
DBUtil.closeResources(null, stmt, result);
}
return account;
}
}
业务逻辑层
服务接口
public interface AuthService {
User authenticate(String username, String pwd);
}
服务实现
public class AuthServiceImpl implements AuthService {
private UserRepository userRepo;
public AuthServiceImpl() {
userRepo = new UserDaoImpl();
}
public User authenticate(String username, String pwd) {
Connection conn = null;
User account = null;
try {
conn = DBUtil.getConnection();
account = userRepo.fetchLoginUser(conn, username);
} finally {
DBUtil.closeConnection(conn);
}
return account;
}
}
控制器实现
public class LoginController extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
AuthService auth = new AuthServiceImpl();
User currentUser = auth.authenticate(username, password);
if (currentUser != null) {
req.getSession().setAttribute("CURRENT_USER", currentUser);
res.sendRedirect("home.jsp");
} else {
req.setAttribute("ERROR_MSG", "认证失败");
req.getRequestDispatcher("login.jsp").forward(req, res);
}
}
}
组件注册
<servlet>
<servlet-name>LoginController</servlet-name>
<servlet-class>com.example.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginController</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
安全增强
会话过滤器
public class AuthFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
User user = (User) request.getSession().getAttribute("CURRENT_USER");
if (user == null) {
((HttpServletResponse) res).sendRedirect("/login.jsp");
} else {
chain.doFilter(req, res);
}
}
}
过滤器配置
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>