La Femme Programmeur

Java tips and tricks from a lady trying to play with the boys...

Tuesday, June 9, 2015

Accessing HttpServletRequest in Spring UserDetailsService (with Annotations)

Using Spring 4.1.5 (but probably later versions of spring). You may have a requirement of getting information from the HTTP Request while your user is logging in using Spring Security. UserDetailsService is an interface, which you may have implemented in order to lookup the username, but loadUserByUsername only takes a String. How do we get the HttpServletRequest?

In your configuration, you should have set up a filter for Spring Security. You'll find this in your SpringWebAppInitializer. The method getServletFilters() should already have been set up with this. You will need to add a RequestContextFilter here before the Spring Security Filter. This will expose the HTTP Request.

@Override protected Filter[] getServletFilters() { 
return new Filter[]{ 
new RequestContextFilter(),
new DelegatingFilterProxy("springSecurityFilterChain")
}; 
}  

After doing this, you should be able to inject the HttpServletRequest right into your UserDetailsService:

@Autowired

private HttpServletRequest request;

That's it!
So easy, but documentation is lacking.

Thursday, March 15, 2012

ExtJS dateFormat Milliseconds

I am creating a page where I am using java.sql.Timestamp to keep track of when a record is updated. When displaying this on a grid, I was finding that the dateformat was failing when trying to display this data in a grid. I was passing the values to the page using JSON, and the date looked like this:
2012-03-14 17:22:31.809
I was unable to find how to format this particular date, since nearly all documentation of dates gives an example of a time without milliseconds. The API documentation states:
 u     Decimal fraction of a second                                              
Examples:
(minimum 1 digit, arbitrary number of digits allowed)         001 (i.e. 0.001s) or
100 (i.e. 0.100s) or
99 (i.e. 0.999s) or
999876543210 (i.e. 0.999876543210s)
 
Nope, this didn't work.

After searching around and trying nearly every letter in the alphabet, it turns out that you need to use ms for milliseconds. Your Date format should look like this:
Y-m-d H:i:s.ms
Hope this helps someone else!!

Friday, August 12, 2011

Proper Indentation on a Tree In ExtJS

I'm using ExtJS's tree functionality to display navigation on a website (and then skinning over it so that it doesn't look like a bunch of folders).  However, a major problem that I was having was that ExtJS absolutely does not allow multiple lines in its tree implementation.  You can update the stylesheet to allow for wrapping with the following entry in your CSS:

.x-tree-node-anchor {
	white-space: normal;	
}

However, this will cause your multiple lines to wrap without the proper indentation.  I struggled with this for many hours before finding an excellent extension that wraps properly.  You can find it here:

IndentedTreeNodeUI

Mad props to JJulian for putting this together!  Hopefully, my links to his page will make this UI easier to find.

Sunday, February 7, 2010

Extjs: JsonStore will not load

I spent a lot of time trying to figure out why my JsonStore wouldn't load into my EditorGrid. No errors were being thrown in Firebug, unless I used loadexception() on the store, in which case the exception really wasn't much help.

Finally, I figured out the problem. Can you spot it?

var js = new Ext.data.JsonStore({  url: 'myurl.jsp',
sortInfo: {field: 'name', direction: 'ASC'},
baseParams: { elementid: '1' },
reader: new Ext.data.JsonReader({
root: 'elements',
id: 'id'
}, [
{name: 'id'},
{name: 'name'}
])
});
js.load();

If not, maybe you are having the same problem I was.

Apparently, when you create a JsonStore, it creates its own JsonReader. So, if you specify a JsonReader, it will ignore yours and use the one it created. By changing the store to Ext.data.Store, it fixed the issue.

A simple fix!

Friday, February 5, 2010

Extjs: XML Tag Name Mismatch

I'm using FileUploadField.js in Extjs. It was working, but then I changed the URL to which I was submitting the form, and then started getting the following error:

XML tag name mismatch (expected br)

This was curious, and I couldn't figure out what the issue was. I googled and found very little help on the subject.

The solution? The problem was in my back-end server code. There was a null pointer exception in my Java code, which returned an HTML error page that is standard for our app. The Extjs processing was expecting JSON, and couldn't find it, obviously. Hence, the error.

If you are using Firebug (which you should be, everyone should be), you will be able to trace the error better by looking at the "Net" tab when you access your Extjs component that is throwing the error. After that, it was an easy fix.

Tuesday, July 14, 2009

New Project: CAS 3 w/Weblogic 9.2

It's been a while, but I'm sure that there are shenanigans afoot since I'm starting a new project of implementing CAS/Acegi (Spring Security) with Weblogic 9.2.

Friday, August 22, 2008

Issues with CVSNT - Switching Between Unicode and Ascii

Problem: Using TortoiseCVS, a developer somehow checked in a bunch of SQL files as Unicode. I am nsure what exactly the developer did to do so, but likely it was caused by right clicking on a file when adding it to CVS and randomly selecting options from the "format" and "keywords" menus there. Who knows.

As the files were checked in and checked out of CVS by various developers, the files became more and more corrupted, merges were difficult, and the developers were unable to do their work without searching for random Unicode characters in the files and deleting them. In addition, CruiseControl stopped recognizing changes to files for updates.

Solution: A command-line interface needs to be used, I was unable to find a resolution with the CVSNT GUI interface.

  1. First, CVS.exe needs to be in your windows path. This was already done on our server because of CruiseControl and ANT using it.
  2. The command from a windows command line is:
    cvs update -kkv
  3. Once you have done this, you can use CVSNT to commit the file. If you do not commit, the changes will not be made. HOWEVER, you cannot commit using standard CVSNT means (TortoiseCVS). You need to right click on the file, select "Command" and enter the command commit -f
  4. The -f on the commit is absolutely necessary.
That's it!