답변:
당신은 하고 안 할 수 는 브라우저의 뒤로 버튼이나 역사를 해제합니다. 사용자 경험에 좋지 않습니다. JavaScript 해킹이 있지만 신뢰할 수 없으며 클라이언트가 JS를 비활성화 한 경우에도 작동하지 않습니다.
구체적인 문제는 요청 된 페이지가 서버에서 직접로드되지 않고 브라우저 캐시에서로드되었다는 것입니다. 이것은 본질적으로 무해하지만 실제로 최종 사용자에게는 혼란 스럽습니다. 왜냐하면 실제로 서버에서 나온 것이라고 잘못 생각하기 때문입니다.
제한된 모든 JSP 페이지를 캐시 하지 않도록 브라우저에 지시하기 만하면됩니다 (따라서 로그 아웃 페이지 / 액션 자체 만이 아닙니다!). 이렇게하면 브라우저가 캐시 대신 서버에서 페이지를 요청해야하므로 서버의 모든 로그인 검사가 실행됩니다. 메소드 에서 필요한 응답 헤더 를 설정 하는 필터 를 사용하여이를 수행 할 수 있습니다 .doFilter()
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);
}
// ...
}
예를 들어 관심 Filter
있는 url-pattern
에 매핑하십시오 *.jsp
.
@WebFilter("*.jsp")
또는이 제한을 보안 페이지에만 적용하려면 모든 보안 페이지를 포함하는 URL 패턴을 지정해야합니다. 예를 들어 모두 폴더에있는 /app
경우 URL 패턴을 지정해야합니다 /app/*
.
@WebFilter("/app/*")
더군다나이 일을 똑같이 할 수 있습니다 Filter
또한 로그인 한 사용자의 존재를 확인하는 .
테스트하기 전에 브라우저 캐시를 지우는 것을 잊지 마십시오! ;)
doFilter()
메서드 를 재정의하기 위해 별도의 Filter 클래스를 만들었습니다 . 로그 아웃 버튼을 누르면 세션을 무효화하는 서블릿으로 리디렉션됩니다. 이 doFilter()
방법이 여기서 어떻게 작동하는지 잘 모르겠습니다 . 이것을 구현하는 방법을 알려주시겠습니까? 에서와 같이 따라야 할 올바른 단계. 감사.
sendRedirect(...)
및 forward()
.
브라우저를 다시 비활성화하지 않고이를 수행하는 가장 간단한 방법은 page_load
로그 아웃 후 사용자가 다시 돌아 가지 않도록하려는 페이지 의 이벤트에 다음 코드를 추가하는 것입니다.
if (!IsPostBack)
{
if (Session["userId"] == null)
{
Response.Redirect("Login.aspx");
}
else
{
Response.ClearHeaders();
Response.ClearContent();
Response.Clear();
Session.Abandon();
Session.Remove("\\w+");
Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
Response.AddHeader("Pragma", "no-cache");
Response.AddHeader("Expires", "0");
}
}