Ustaw i przeczytaj pliki cookie w Spring MVC / Security
Jestem nowym użytkownikiem Springa i muszę kliknąć niestandardowy plik cookie po kliknięciu przycisku „Login”, a następnie plik cookie będzie czerwony wewnątrz aplikacji internetowej. Jaka jest najlepsza praktyka, aby to dokładnie zrobić? Co więcej, pojawia się pytanie, jak przeczytać to później na każdej stronie w aplikacji internetowej?
Pomyślałem, że mogę ustawić pliki cookie za pomocą JavaScript i odczytać je później za pomocą niestandardowego filtru (który odczytywałby plik cookie z żądania, ustawiał go na atrybut i wysyłał do kontrolera.
Czy ta myśl jest poprawna? Czy powinienem ustawić plik cookie w innym miejscu (jeśli tak, to gdzie i dlaczego?)
AKTUALIZACJA 1:
Co chcę osiągnąć: Mam listę rozwijaną (która jest selektorem języka) na stronie logowania, która ma pewne wartości (kod języka, np. „En”), a wybrana wartość musi być ustawiona jako cookie (np. „Lang”) i to Plik „lang” będzie czerwony na i18n później na stronach. Sprawiłem, że i18n zadziałał, ale muszę przeczytać plik cookie „lang”, aby ustawić wybrany język.
AKTUALIZACJA 2:
Zrobiłem to, co chciałem zrobić, ale to nie jest dokładnie czyste:
Ustawiam plik cookie za pomocą Javascript lub jQuery, aby być dokładnym, a kiedy użytkownik wybiera lub zmienia wybór w<select/>
następnie Javascript wprowadza wartość językową jako cookie (np. en):
HTML:
<select name="language" id="selectLanguage" class="form-control">
<option val="en">English</option>
</select>
JS:
var cookie = {
set: function($this) {
var now = new Date();
var time = now.getTime();
var expireTime = time + 1000*36000;
now.setTime(expireTime);
document.cookie = 'lang=' + $this.val() +';expires='+now.toGMTString()+';path=/';
}
}
$('#selectLanguage').change(function(event) {
cookie.set($(this));
});
Potem stworzyłem nowyFiler zadzwoniłemCookieFilter.java:
public class CookieFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
Cookie[] cookies = ((HttpServletRequest) req).getCookies();
if (cookies != null) {
for (Cookie ck : cookies) {
if(ck.getName().toString().equals("lang")){
req.setAttribute("languageCookie", ck.getValue());
} else {
req.setAttribute("languageCookie", "en");
};
}
chain.doFilter(req, res);
}
}
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
}
public void destroy() {
// TODO Auto-generated method stub
}
}
Dodano nowefiltr wweb.xml:
<filter>
<filter-name>CookieFilter</filter-name>
<filter-class>
package.path.to.CookieFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CookieFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
I żeby wszystko skończyć, otrzymałem prośbęCookieFilter w moim kontrolerze i czerwonym atrybutem, który wysłałem:
String cookie = request.getAttribute("languageCookie").toString();
model.addAttribute("languageCookie",cookie);
Teraz mogę odczytać atrybut zmodel
i ustaw go w .JSP lub zrób wszystko, co chcę.
To jest moje rozwiązanie, ale musi być inny sposób ... :)